home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / games / spassion / source.lzh / SOURCE / SUB.C < prev    next >
Text File  |  2000-03-29  |  5KB  |  231 lines

  1. /*
  2.  *        スプライトその他の処理をする関数群
  3.  */
  4. #include <stdio.h>
  5. #include <doslib.h>
  6. #include <iocslib.h>
  7. #include <io.h>
  8. #include "SPASSION.H"
  9. #include "ENTRY.H"
  10. #include "BG.H"
  11. #include "SOUND.H"
  12. #include "SUB.H"
  13.  
  14. /*
  15.  *        スペースキー入力を待つ
  16.  */
  17.  
  18. void key_wait()
  19. {
  20.     void game_end();
  21.     while(  BITSNS(0x06) & BIT(0x05) );                /* 離されるまで待つ */
  22.     while(!(BITSNS(0x06) & BIT(0x05)))                /* 押されるまで待つ */
  23.         if( BITSNS(0x00) & BIT(0x01) )game_end();    /* ESCが押されたら END */
  24.     while(  BITSNS(0x06) & BIT(0x05) );                /* 離されるまで待つ */
  25. }
  26.  
  27.  
  28. /*
  29.  *        joy stick & キー入力ルーチン
  30.  */
  31.  
  32. char GetKey( short num ,short button_swap )
  33. {
  34.     int k;
  35.     char s=0, s1=0;
  36.  
  37.     s = ~JOYGET( num );
  38.  
  39.     k = BITSNS( 8 );
  40.     if( k & 0x10 )s |= KEY_UP;
  41.     if( k & 0x80 )s |= KEY_LEFT;
  42.     k = BITSNS( 9 );
  43.     if( k & 0x02 )s |= KEY_RIGHT;
  44.     if( k & 0x10 )s |= KEY_DOWN;
  45.     k = BITSNS( 14 );
  46.     if( !button_swap ){
  47.         if( k & 0x08 )
  48.             s |= A_BUTTON;
  49.         if( k & 0x04  )
  50.             s |= B_BUTTON;
  51.         return s;
  52.     }else{
  53.         /* A B ボタン入れ換え */
  54.         s1 = (s&0x0F);        /* キーだけ */
  55.         if( k & 0x08 || s & A_BUTTON )
  56.             s1 |= B_BUTTON;
  57.         if( k & 0x04 || s & B_BUTTON )
  58.             s1 |= A_BUTTON;
  59.         return s1;
  60.     }
  61.     return s;
  62. }
  63.  
  64.  
  65. /*
  66.  *        joy stick & キー入力ルーチン(メニュー用)
  67.  */
  68.  
  69. char GetKeyM( short num )
  70. {
  71.     int k;
  72.     char s = 0;
  73.  
  74.     s = ~JOYGET( num );
  75.  
  76.     k = BITSNS( 8 );
  77.     if( k & 0x10 )s |= KEY_UP;
  78.     if( k & 0x80 )s |= KEY_LEFT;
  79.     k = BITSNS( 9 );
  80.     if( k & 0x02 )s |= KEY_RIGHT;
  81.     if( k & 0x10 )s |= KEY_DOWN;
  82.     k = BITSNS( 14 );
  83.     if( k & 0x08 )
  84.         s |= A_BUTTON;
  85.     if( k & 0x04 )
  86.         s |= B_BUTTON;
  87.  
  88.     return s;
  89. }
  90.  
  91.  
  92. void    InitMapData( void )
  93. {
  94.     extern unsigned short bg_map1[32 * 32 * 6];
  95.     extern unsigned short bg_map2[32 * 32 * 6];
  96.     extern unsigned short bg_map3[32 * 32 * 6];
  97.     extern unsigned short bg_map4[32 * 32 * 6];
  98.  
  99.     bg_map[0]=&bg_map1[0];
  100.     bg_map[1]=&bg_map2[0];
  101.     bg_map[2]=&bg_map3[0];
  102.     bg_map[3]=&bg_map4[0];
  103.     /* マップデータ読み込み */
  104.     LoadFile("BG/STAGE01.SP", &bg_sp[0][0], sizeof (char), 32 * 256);
  105.     LoadFile("BG/STAGE01.PAL", &bg_pal[0][0], sizeof (short), 16 );
  106.     LoadFile("BG/STAGE02.SP", &bg_sp[1][0], sizeof (char), 32 * 256);
  107.     LoadFile("BG/STAGE02.PAL", &bg_pal[1][0], sizeof (short), 16 );
  108.     LoadFile("BG/STAGE03.SP", &bg_sp[2][0], sizeof (char), 32 * 256);
  109.     LoadFile("BG/STAGE03.PAL", &bg_pal[2][0], sizeof (short), 16 );
  110.     LoadFile("BG/STAGE04.SP", &bg_sp[3][0], sizeof (char), 32 * 256);
  111.     LoadFile("BG/STAGE04.PAL", &bg_pal[3][0], sizeof (short), 16 );
  112. }
  113.  
  114. void Init( void )
  115. {
  116.     void    LoadXSPFile( void );
  117.     void    InitXSP( void );
  118.     void    InitSound( void );
  119.     void    InitShot0( void );
  120.     void    InitEShot0( void );
  121.     void    InitEnemyHit( void );
  122.  
  123.     OS_CUROF();
  124.     CRTMOD( 16 );            /* 768*512dot 16色 グラフィックプレーン1枚 31kHz */
  125.     G_CLR_ON();
  126.     MS_CUROF();                /* マウスカーソルを消す */
  127.     printf("Please Wait...\n");
  128.  
  129.     /* 角度のテーブルを読み込む */
  130.     LoadFile( "TBL/ANGLE.TBL", angle_tbl, sizeof (unsigned char), 256*256 );
  131.  
  132.     /* 角度毎の速度のテーブルを読み込む */
  133.     LoadFile( "TBL/VXTABLE.TBL", vx_tbl, sizeof (signed int), 256 * SPEED_MAX );
  134.     LoadFile( "TBL/VYTABLE.TBL", vy_tbl, sizeof (signed int), 256 * SPEED_MAX );
  135.  
  136.     LoadFile ("TBL/PT_ROT.TBL", pt_rot, sizeof (short), 256);
  137.     LoadFile ("TBL/INFO_ROT.TBL", info_rot, sizeof (short), 256);
  138.     LoadFile ("TBL/RNDTABLE.TBL", rndtable, sizeof (unsigned char), 256);
  139.  
  140.     /*敵エントリーデータ読み込み*/
  141.     LoadFile("ST_DAT/STAGE01.DAT", &stage_data[0][0], sizeof (ENTRY), ENTRY_MAX);
  142.     LoadFile("ST_DAT/STAGE02.DAT", &stage_data[1][0], sizeof (ENTRY), ENTRY_MAX);
  143.     LoadFile("ST_DAT/STAGE03.DAT", &stage_data[2][0], sizeof (ENTRY), ENTRY_MAX);
  144.     LoadFile("ST_DAT/STAGE04.DAT", &stage_data[3][0], sizeof (ENTRY), ENTRY_MAX);
  145.  
  146.     game_state=!IN_TITLE;
  147.     SUPER(0);
  148.     InitSound();
  149.     LoadXSPFile();
  150.     InitMapData();
  151.     InitShot0();
  152.     InitEShot0();
  153.     InitEnemyHit();
  154.     InitEntry();
  155.     CRTMOD( 10 );            /* 256*256dot 256色 グラフィックプレーン1枚 31kHz */
  156.     G_CLR_ON();
  157.     MS_CUROF();                /* マウスカーソルを消す */
  158.     SKEY_MOD(0,0,0);
  159.     *(unsigned short *) 0xe82500 = 0b01001001001110;    /* 優先順位 TX>SP>GR */
  160.     InitXSP();
  161. }
  162.  
  163. /* ファイル読み込み */
  164. /* 読み込みに失敗した場合はいきなり終了するので注意 */
  165. int        LoadFile (char *fname, void *ptr, int size, int n)
  166. {
  167.     FILE *fp;
  168.     int i;
  169.     void    game_end( void );
  170.  
  171.     if ((fp = fopen (fname, "rb")) == NULL) {
  172.         static char e[256];
  173.         error_level = ERROR_FILE;
  174.         error_message = e;
  175.         sprintf(e, "\nファイル %s が読み込めません\n"
  176.                     "強制終了します。\n"
  177.         , fname);
  178.         game_end();
  179.     }
  180.     i = fread (ptr, size, n, fp);
  181.     fclose (fp);
  182.  
  183.     return (i);        /* 返り値は読み込み項目数 */
  184. }
  185.  
  186.  
  187. /*
  188.  *    (x1,y1)から見た(x2,y2)の向きを求める
  189.  *    返り値は、右回りに、
  190.  *               192
  191.  *            128 +  0 
  192.  *                64        となる
  193.  */
  194.  
  195. unsigned char     calc_direction(short x1, short y1, short x2, short y2)
  196. {
  197.     short    dx = x2 - x1; 
  198.     short    dy = y2 - y1,dir=0;
  199.  
  200.     /* 安全のため dx,dy 共に -255~255 の範囲に納める */
  201.     if (dx > 255) {
  202.         dx = 255;
  203.     } else {
  204.         if (dx < -255) {
  205.             dx = -255;
  206.         }
  207.     }
  208.     if (dy > 255) {
  209.         dy = 255;
  210.     } else {
  211.         if (dy < -255) {
  212.             dy = -255;
  213.         }
  214.     }
  215.  
  216.     if (dx > 0) {
  217.         if (dy > 0) {
  218.             return (angle_tbl[dx][dy] + 64);
  219.         } else {
  220.             return (64 - angle_tbl[dx][-dy]);
  221.         }
  222.     } else {
  223.         if (dy > 0) {
  224.             return (192 - angle_tbl[-dx][dy]);
  225.         } else {
  226.             return (192 + angle_tbl[-dx][-dy]);
  227.         }
  228.     }
  229.     return dir;
  230. }
  231.